/* Fichier syntaxe.y */
/*BIZET Jonathan
FOLZ PAULINE
Master 1 ALMA*/
%{
/*Version 1:-Pas de debordement de case
	    -Pas de mise en place du texte pour une colonne donnee
	    -input tres simple ne contenant que le code TeX decrivant le tableau
	*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
extern numLigne ;
extern nbC;
extern colonne;
int colTraite=0;
FILE* f;
%}
%union{char cval[1000];
	int ival;
	float fval;}

%token  <ival> NOMBRE
%token  <cval> CHAINE
%token  <cval> BF
%token <fval>  REEL
%token  <cval> BTABLE
%token  <cval> BCENTER
%token  <cval> BTABULAR
%token  <cval> ETABULAR
%token  <cval> ECENTER
%token  <cval> ETABLE
%token  <cval> MULTIC
%token  <cval> BSBS
%token  <cval> ETOILE
%token  <cval> VIRGULE
%token  <cval> HLINE
%token  <cval> TABULATION
%token  <cval> EC
%token  <cval> AO
%token  <cval> AF
%token  <cval> COLLSPAN
%token  <cval> BS
%token  <cval> DOLLAR
%token  <cval> CAPTION
%type   <cval> Tableau Corps Cellule Contenu Poubelle Legende ContenuLegende Texte

%start Start
%%

Start:
     Poubelle Tableau 
  | /* rien !! */
;

Tableau :
       	BTABULAR TABULATION Corps ETABULAR Legende Poubelle{char line[5000]="";
						    strcat(line,"<html>\n\t<body>\n\t\t<table border cellspacing=0>");
						    strcat(line,$3);
                                                    strcat(line,"\n\t\t</table>");
					            strcat(line,$5);
						    strcat(line,"\n\t</body>\n</html>");
						    fprintf(f,"%s",line);
						    fclose(f);}
	|BTABULAR TABULATION Corps ETABULAR Poubelle{char line[5000]="";
					      strcat(line,"<html>\n\t<body>\n\t\t<table border='1px'>");
					      strcat(line,$3);
					      strcat(line,"\n\t\t</table>\n\t</body>\n</html>");
					      fprintf(f,"%s",line);
					      fclose(f);}
;	

Corps :
	HLINE Cellule Corps {char line[5000]="";
				   strcat(line,"\n\t\t\t<tr>");
                                   strcat(line,$2);
                                   strcat(line,"\n\t\t\t</tr>");
                                   strcat(line,$3);
				   strcpy($$,line);
					}
	|HLINE Cellule HLINE {char line[5000]="";	
		             strcat(line,"\n\t\t\t<tr>");
                             strcat(line,$2);
                             strcat(line,"\n\t\t\t</tr>");
			     strcpy($$,line);}
	|HLINE Corps {char line[5000]="";
		      strcat(line,"\n\t\t\t<tr>\n\t\t\t</tr>");
                      strcat(line,$2);
                      strcpy($$,line);}
	|HLINE {strcpy($$,"\n\t\t\t<tr>\n\t\t\t</tr>");}
;

Cellule:
	Contenu EC Cellule {char line[5000]="";
			   			strcat(line,"\n\t\t\t\t<td ");
						switch(((char*)colonne)[colTraite%nbC]){
							case 'r':
									 strcat(line,"align=right>");
									 break;
							case 'c':
									 strcat(line,"align=center>");
									 break;
							case 'l':
									strcat(line,"align=left>");
									 break;
							
						}
                        strcat(line,$1);
					    strcat(line,"</td>");
					    strcat(line,$3);
					    strcpy($$,line);
						colTraite++;}
	
	|Contenu BSBS 	{char line[5000]="";
   			strcat(line,"\n\t\t\t\t<td ");
			switch(((char*)colonne)[colTraite%nbC]){
				case 'r':
						 strcat(line,"align=right>");
						 break;
				case 'c':
						 strcat(line,"align=center>");
						 break;
				case 'l':
						strcat(line,"align=left>");
						 break;
				
			}
		    strcat(line,$1);
		    strcat(line,"</td>");
		    strcpy($$,line);
		    colTraite++;}
	
	|EC Cellule {char line[5000]="";
		     strcat(line,"\n\t\t\t\t<td></td>");
		     strcat(line,$2);
		     strcpy($$,line);
		     colTraite++;}
 
	|MULTIC AO NOMBRE AF TABULATION AO Contenu AF EC Cellule {char line[5000]="";
			    strcat(line,"\n\t\t\t\t<td colspan=\"");
                            char nb[3];
			    sprintf(nb,"%d",$3);
			    strcat(line,nb);
			    strcat(line,"\"");
			    char * pch;
			    if((pch=strchr($5,'c'))!=NULL){
				strcat(line," align=center>");
			    }else if((pch=strchr($5,'l'))!=NULL){
				strcat(line," align=left>");
		   	    }else if((pch=strchr($5,'r'))!=NULL){
				strcat(line," align=right>");
			    }
			     strcat(line, $7);
			    strcat(line,"</td>");
			    strcat(line,$9);
			    strcpy($$,line);
			     colTraite+=$3;}
	
	|MULTIC AO NOMBRE AF TABULATION AO Contenu AF BSBS {char line[5000]="";
			    strcat(line,"\n\t\t\t\t<td colspan=\"");
                            char nb[3];
			    sprintf(nb,"%d",$3);
			    strcat(line,nb);
			    strcat(line,"\"");
			    char * pch;
			    if((pch=strchr($5,'c'))!=NULL){
				strcat(line," align=center>");
			    }else if((pch=strchr($5,'l'))!=NULL){
				strcat(line," align=left>");
		   	    }else if((pch=strchr($5,'r'))!=NULL){
				strcat(line," align=right>");
			    }
			    strcat(line,$7);
			    strcat(line,"</td>");
			    strcpy($$,line);
			    colTraite+=$3;}
;
Contenu:
	Texte {strcpy($$,$1);}
	|AO BF Texte AF	{char line[5000];
			 strcat(line,"<b>");
			strcat(line,$3);
			strcat(line,"</b>");
			strcpy($$,line);			 
			}
;
Texte:
	CHAINE {strcpy($$,$1);}
	|REEL	{sprintf($$,"%f",$1);}
	|NOMBRE {sprintf($$,"%d",$1);}
	|DOLLAR Texte DOLLAR {strcpy($$,$2);}
	
	|Texte CHAINE {strcpy($$,$1);
		       strcat($$,$2);}
	|Texte REEL {strcat($$,$1);
		     char nb[10];
		     sprintf(nb,"%f",$2);
		     strcat($$,nb);}
	|Texte NOMBRE {strcat($$,$1);
		       char nb[10];
		       sprintf(nb,"%d",$2);
		       strcat($$,nb);}
;

ContenuLegende :
	Contenu {strcpy($$,$1);}
	|Contenu ContenuLegende {char line[5000]="";
				 strcat(line,$1);
				 strcat(line,$2);
				 strcpy($$,line);}
;

Legende:
	CAPTION AO ContenuLegende AF { char line[5000]="";
				       strcat(line,"\n\t\t<p>");
			               strcat(line,$3);
				       strcat(line,"</p>");
				       strcpy($$,line);} 
;

Poubelle :
	CHAINE {}
	|NOMBRE {}
	|REEL {}
	|AO {}
	|AF {}
	|BS {}
	|ETOILE {}
	|VIRGULE {}
	|DOLLAR
	|DOLLAR Poubelle
	|VIRGULE Poubelle {}
	|BS Poubelle {}
	|ETOILE Poubelle {}
	|AO Poubelle {}
	|AF Poubelle {}
	|CHAINE Poubelle {}
	|NOMBRE Poubelle {}
	|REEL Poubelle {}
;

%%

extern  FILE * yyin;
int yywrap(){
    return 1 ;
}


void yyerror(char *str){
        fprintf(stderr,"Erreur à la ligne %d : %s\n",numLigne, str) ;
}
int main(){
	f=fopen("tab.html", "w");
	yyin=fopen("tab.tex","r");
	printf("[CTRL-D pour finir]\n");
        yyparse();
	fclose(yyin);
        printf("Fin d'execution.\n") ;
        return 0;
}
